#!/bin/bash

# 预处理内容
# 指定工作主目录
if [ ! -d ~/Music/talk ];then
	mkdir ~/Music/talk
fi
cd ~/Music/talk

# 常量
talktime=$(TZ='Asia/Shanghai' date +北京时间%H点%M分)	#当前时间
format="mp3"	#音频格式

# 变量
input=""	#输入的文字
output=""	#输出的音频文件
file1=""	#合并的第一个文件
file2=""	#合并的第二个文件

# 脚本说明及帮助
usage()
{
	echo "脚本名称：toopen-talkable"
	echo "版本：20250720_1"
	echo "作者及版权所有者：孤岛悬城"
	echo "脚本功能：实现文件转语音的便捷操作，操作方法如下↓↓↓"
	echo "$(basename "$0") [选项] [文字] [音频文件名]
	选项：
	-s	保留音频文件（save）
	-t	播放当前时间（time）
	"
}

# 清除创建失败的音频文件
RmErrAudio()
{
	if [ $(pwd) == "/home/$USER/Music/talk" ];then
		# 使用find命令查找大小为0字节的文件并删除
		find -type f -size 0c -exec rm -f {} \;
	fi
}

# 播放音频文件
playaudio()
{
	mpv --no-video $output.$format
}

# 文字转音频文件
TxtToFile()
{
	if [ -f "$output.$format" ];then
		echo "播放~/Music/talk/$output.$format"
	elif edge-tts -v zh-CN-XiaoxiaoNeural -t "$input" --write-media "$output.$format";then
		echo "edge-tts：~/Music/talk/$output.$format"
	else
		echo "ekho：~/Music/talk/$output.$format"
		ekho "$input" -o "$output.$format"
	fi
}

# 文字转语音
TxtToAudio()
{
	if [ -f "$output.$format" ];then
		mpv --no-video $output.$format
	elif edge-playback -v zh-CN-XiaoxiaoNeural -t "$input";then
		echo "edge-tts：$input"
	else
		echo "ekho：$input"
		ekho "$input"
	fi
}

# 合并音频文件
#-c:a libmp3lame \	mp3格式
MergeAudioFiles()
{
	if [ -f "$output.$format" ];then
		echo "合并音频"
	elif [ $format == "wav" ];then
		ffmpeg -i $file1.$format -i $file2.$format \
		-filter_complex "concat=n=2:v=0:a=1[outa]" \
		-map "[outa]" \
		-c:a pcm_s16le \
		$output.$format
	elif [ $format == "mp3" ];then
		ffmpeg -i $file1.$format -i $file2.$format \
		-filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" \
		-c:a libmp3lame \
		-q:a 2 \
		$output.$format
	else
		echo "音频格式不支持"
	fi
}

# 当有3个参数时，第1个参数为选项，第2个参数为语音内容，第3个参数为音频文件名称。
parm3()
{
	if [ "$1" == "-s" ];then
		input="$2"
		output="$3"
		TxtToFile
		playaudio
	elif [ "$1" == "-st" ] || [ "$1" == "-ts" ];then
		input="$talktime"
		output="$talktime"
		TxtToFile
		file1=$output

		input="$2"
		output="$2"
		TxtToFile
		file2=$output

		output="$3"
		MergeAudioFiles
		playaudio
	else
		usage
	fi
}

# 当有2个参数时，第1个参数为选项，第2个参数为语音内容。
parm2()
{
	if [ "$1" == "-s" ];then
		input="$2"
		output="$2"
		TxtToFile
		playaudio
	elif [ "$1" == "-t" ];then
		input="$talktime"
		output="$talktime"
		TxtToFile
		file1=$output

		input="$2"
		output="$2"
		TxtToFile
		file2=$output

		output="$file1""$file2"
		MergeAudioFiles
		playaudio
		rm $file1.$format $file2.$format $output.$format
	elif [ "$1" == "-st" ] || [ "$1" == "-ts" ];then
		input="$talktime"
		output="$talktime"
		TxtToFile
		file1=$output

		input="$2"
		output="$2"
		TxtToFile
		file2=$output

		output="$file1""$file2"
		MergeAudioFiles
		playaudio
	else
		usage
	fi
}

# 当有1个参数时，第1个参数可以为选项，也可以为语音内容。
parm1()
{
	if [ "$1" == "-t" ];then
		input="$talktime"
		output="$talktime"
		TxtToFile
		playaudio
		rm $output.$format
	elif [ "$1" == "-st" ] || [ "$1" == "-ts" ];then
		input="$talktime"
		output="$talktime"
		TxtToFile
		playaudio
	elif [[ "$1" =~ ^-.+ ]]; then
		usage
	else
		output="$1"
		input="$1"
		TxtToAudio
	fi
}

# 主程序
RmErrAudio
case $# in
	3)
		parm3 $1 $2 $3
		;;
	2)
		parm2 $1 $2
		;;
	1)
		parm1 $1
		;;
	*)
		usage
		;;
esac
